package cn.mdmbct.douyin.basis.service.interfaces;

import cn.mdmbct.douyin.basis.body.interaction.ImMessageSendReqBody;
import cn.mdmbct.douyin.basis.body.interaction.ItemCommentReplyReqBody;
import cn.mdmbct.douyin.basis.body.interaction.VideoCommentTopReqBody;
import cn.mdmbct.douyin.basis.response.interaction.ImMessageSendRes;
import cn.mdmbct.douyin.basis.response.interaction.ItemCommentListRes;
import cn.mdmbct.douyin.basis.response.interaction.ItemCommentReplyRes;
import cn.mdmbct.douyin.common.enums.MethodType;
import cn.mdmbct.douyin.common.proxy.annotations.Mapping;
import cn.mdmbct.douyin.common.proxy.annotations.RequestBody;
import cn.mdmbct.douyin.common.proxy.annotations.RequestParam;
import cn.mdmbct.douyin.common.response.DefaultResponseData;

/**
 * 互动管理服务接口
 *
 * @author mdmbct  mdmbct@outlook.com
 * @date 2021/4/18 16:36
 * @modified mdmbct
 * @since 1.0
 */
public interface InteractionManagerService {

    /**
     * <a href="https://open.douyin.com/platform/doc/6848798514797938700">评论列表</a>
     * <p>
     * Scope: <p>
     * `item.comment` 普通用户 <p>
     * `video.comment` 企业号 <p>
     * 需要申请权限需要用户授权<p>
     * 该接口用于获取评论列表。<p>
     * <p>
     * 注意：
     * <p>
     * 抖音的OAuth API以https://open.douyin.com/开头。<p>
     * 注意参数中item_id作为url参数时，必须encode，只对item_id单独进行encode
     *
     * @param openId   通过/oauth/access_token/获取，用户唯一标志
     * @param cursor   分页游标, 第一页请求cursor是0, response中会返回下一页请求用到的cursor, 同时response还会返回has_more来表明是否有更多的数据。
     * @param count    每页的数量，最大不超过50，最小不低于1
     * @param itemId   视频id
     * @param sortType 列表排序方式，不传默认按推荐序，可选值：time(时间逆序)、time_asc(时间顺序)
     * @return comment list response data
     */
    @Mapping("/item/comment/list")
    ItemCommentListRes.ItemCommentListResData getCommentList(@RequestParam("open_id") String openId,
                                                             @RequestParam long cursor,
                                                             @RequestParam int count,
                                                             @RequestParam("item_id") String itemId,
                                                             @RequestParam("sort_type") String sortType);

    /**
     * <a href="https://open.douyin.com/platform/doc/6848806819897411591">评论回复列表</a>
     * <p>
     * Scope: <p>
     * `item.comment` 普通用户 <p>
     * `video.comment` 企业号 <p>
     * 需要申请权限需要用户授权<p>
     * 该接口用于获取评论回复列表。<p>
     * <p>
     * 注意：
     * <p>
     * 抖音的OAuth API以https://open.douyin.com/开头。<p>
     * 注意参数中item_id作为url参数时，必须encode，只对item_id单独进行encode<p>
     * 注意参数中comment_id作为url参数时，必须encode，只对comment_id单独进行encode<p>
     *
     * @param openId   通过/oauth/access_token/获取，用户唯一标志
     * @param cursor   分页游标, 第一页请求cursor是0, response中会返回下一页请求用到的cursor, 同时response还会返回has_more来表明是否有更多的数据。
     * @param count    每页的数量，最大不超过50，最小不低于1
     * @param itemId   视频id
     * @param sortType 列表排序方式，不传默认按推荐序，可选值：time(时间逆序)、time_asc(时间顺序)
     * @return
     */
    @Mapping("/item/comment/reply/list")
    ItemCommentReplyRes.ItemCommentReplyResData getCommentReplyList(@RequestParam("open_id") String openId,
                                                                    @RequestParam long cursor,
                                                                    @RequestParam int count,
                                                                    @RequestParam("item_id") String itemId,
                                                                    @RequestParam("sort_type") String sortType);


    /**
     * <a href="https://open.douyin.com/platform/doc/6848798514797971468">回复视频评论</a>
     * <p>
     * Scope: <p>
     * `item.comment` 普通用户 <p>
     * `video.comment` 企业号 <p>
     * 需要申请权限需要用户授权<p>
     * 该接口用于回复视频评论。
     *
     * @param openId 通过/oauth/access_token/获取，用户唯一标志
     * @param body
     * @return
     */
    @Mapping(value = "/item/comment/reply", method = MethodType.POST)
    ItemCommentReplyRes.ItemCommentReplyResData replyComment(@RequestParam("open_id") String openId,
                                                             @RequestBody ItemCommentReplyReqBody body);


    /**
     * <a href="https://open.douyin.com/platform/doc/6848806544931391501">置顶、取消置顶视频评论(企业号)</a>
     * <p>
     * Scope: `video.comment`需要申请权限需要用户授权<p>
     * 该接口用于置顶视频评论。<p>
     * <p>
     * 注意：
     * <p>
     * 抖音的OAuth API以https://open.douyin.com/开头。<p>
     * 调用本接口，需要授权的抖音用户是企业号企业号 。
     *
     * @param openId 通过/oauth/access_token/获取，用户唯一标志
     * @param body
     * @return
     */
    @Mapping(value = "/video/comment/top", method = MethodType.POST)
    DefaultResponseData topComment(@RequestParam("open_id") String openId,
                                   @RequestBody VideoCommentTopReqBody body);

    /**
     * <a href="https://open.douyin.com/platform/doc/6848798087226329100">发送消息</a>
     * <p>
     * Scope: `enterprise.im`需要申请权限需要用户授权<p>
     * 该接口用于主动发送私信至抖音用户，支持文本、图片（需上传至素材库）、视频消息和企业消息卡片。<p>
     * 可结合客服管理接口，提升客服场景体验<p>
     * <p>
     * 注意：使用该能力，需要授权的抖音用户是企业号
     * <p>
     * 具体私信消息类型见下方Schema：<p>
     * <pre>
     * text
     * {
     *   text: string  //文字内容
     * }
     *
     * image
     * {
     *   media_id: string //素材id
     * }
     *
     * video
     * {
     *   item_id: string //视频id
     * }
     *
     * card
     * {
     *   card_id: string //卡片id
     * }
     * </pre>
     *
     * @param openId 通过/oauth/access_token/获取，用户唯一标志
     * @param body
     * @return
     */
    @Mapping(value = "/enterprise/im/message/send", method = MethodType.POST)
    ImMessageSendRes.ImMessageSendResData sendImMessage(@RequestParam("open_id") String openId,
                                                        @RequestBody ImMessageSendReqBody body);
}
